package br.com.sgpv2.entity.movimentacao;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Transient;

import org.hibernate.annotations.LazyCollection;
import org.hibernate.annotations.LazyCollectionOption;

import br.com.sgpv2.entity.cargos.CargoFuncao;
import br.com.sgpv2.entity.folha.Folha;
import br.com.sgpv2.entity.pessoa.Contrato;
import br.com.sgpv2.util.Util;


@Entity
@Table(name = "mov_movimentacao")
@SequenceGenerator(name = "sequenceMovimentacao", sequenceName = "mov_movimentacao_id_seq")
public class Movimentacao implements Serializable{
	
	private static final long serialVersionUID = -3397843774557751574L;
	
	private int id;
	private CargoFuncao funcional;
	private CargoFuncao trabalhista;
	private Date data;
	private Integer ano;
	private Integer mes;
	private BigDecimal proventos;
	private BigDecimal descontos;
	private BigDecimal liquido;
	private BigDecimal salarioFamilia;
	private BigDecimal inss;
	private BigDecimal irrf;
	private BigDecimal fgts;
	private BigDecimal totalSalarioFamilia;
	private BigDecimal totalInss;
	private BigDecimal totalIrrf;
	private BigDecimal totalFgts;
	private Contrato contrato;
	private List<ValoresEvento> valoresEvento;
	private Folha folha;
	private BigDecimal salarioBaseMovimentacao; 
	
	public Movimentacao() {
		this.valoresEvento = new ArrayList<ValoresEvento>();
		this.proventos = new BigDecimal(0);
		this.descontos = new BigDecimal(0);
		this.salarioFamilia = new BigDecimal(0);
		this.inss = new BigDecimal(0);
		this.irrf = new BigDecimal(0);
		this.fgts = new BigDecimal(0);
		this.liquido = new BigDecimal(0);
		this.totalSalarioFamilia = new BigDecimal(0);
		this.totalInss = new BigDecimal(0);
		this.totalIrrf = new BigDecimal(0);
		this.totalFgts = new BigDecimal(0);
		
		
	}
	
	/**
	 * Recupera o valor do ID da entidade.
	 */
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name = "mov_id", nullable = false)	
	public int getId() {
		return id;
	}
	/**
	 * Configura o valor do ID da entidade.
	 */
	public void setId(int id) {
		this.id = id;
	}
	
	/**
	 * Recupera o valor do cargo fuincional da entidade.
	 */
	@OneToOne
	@JoinColumn(name = "caf_id", insertable=false, updatable = false)
	public CargoFuncao getFuncional() {
		return funcional;
	}
	/**
	 * Configura o valor do cargo fuincional da entidade.
	 */
	public void setFuncional(CargoFuncao funcional) {
		this.funcional = funcional;
	}
	
	/**
	 * Recupera o valor do cargo trabalhista da entidade.
	 */
	@OneToOne
	@JoinColumn(name = "caf_id",insertable=false, updatable = false)
	public CargoFuncao getTrabalhista() {
		return trabalhista;
	}	
	/**
	 * Configura o valor do cargo fuincional da entidade.
	 */
	@OneToOne
	@JoinColumn(name = "caf_id")
	public void setTrabalhista(CargoFuncao trabalhista) {
		this.trabalhista = trabalhista;
	}
	
		
	/**
	 * Recupera o valor da data da entidade.
	 */
	@Column(name="mov_data", nullable=false)
	public Date getData() {
		return data;
	}
	/**
	 * Configura o valor da data da entidade.
	 */
	public void setData(Date data) {
		this.data = data;
	}
	
	/**
	 * Recupera o valor da data da entidade.
	 */
	@Column(name="mov_salario_familia")
	public BigDecimal getSalarioFamilia() {
		return salarioFamilia;
	}	
	/**
	 * Configura o valor da data da entidade.
	 */
	public void setSalarioFamilia(BigDecimal salarioFamilia) {
		this.salarioFamilia = salarioFamilia;
	}
	
	/**
	 * Recupera o valor do provento.
	 */
	@Column(name="mov_proventos")
	public BigDecimal getProventos() {
		return proventos;
	}
	/**
	 * Configura o valor do provento.
	 */
	public void setProventos(BigDecimal proventos) {
		this.proventos = proventos;
	}
	
	/**
	 * Recupera o valor do inss.
	 */
	@Column(name="mov_inss")
	public BigDecimal getInss() {
		return inss;
	}
	/**
	 * Configura o valor do inss.
	 */
	public void setInss(BigDecimal inss) {
		this.inss = inss;
	}
	
	/**
	 * Recupera o valor dos descontos.
	 */
	@Column(name="mov_descontos")
	public BigDecimal getDescontos() {
		return descontos;
	}
	/**
	 * Configura o valor dos descontos.
	 */
	public void setDescontos(BigDecimal descontos) {
		this.descontos = descontos;
	}
	
	/**
	 * Recupera o valor liquido.
	 */
	@Column(name="mov_liquido")
	public BigDecimal getLiquido() {
		return liquido;
	}
	/**
	 * Configura o valor liquido.
	 */
	public void setLiquido(BigDecimal liquido) {
		this.liquido = liquido;
	}
	
	@Column(name="mov_ano", nullable=false)
	public Integer getAno() {
		return ano;
	}
	
	public void setAno(Integer ano) {
		this.ano = ano;
	}
	
	@Column(name="mov_mes", nullable=false)
	public Integer getMes() {
		return mes;
	}
	
	public void setMes(Integer mes) {
		this.mes = mes;
	}
	
	
	/**
	 * Recupera a pessoa ligada a entidade.
	 */
	@ManyToOne
	@JoinColumn(name = "con_id", nullable = false)
	@LazyCollection(LazyCollectionOption.FALSE)
	public Contrato getContrato() {
		return contrato;
	}
	/**
	 * Configura a pessoa ligada a entidade.
	 */
	public void setContrato(Contrato contrato) {
		this.contrato = contrato;
	}
	
	/**
	 * Recupera os valores eventos de uma movimentação.
	 */
	@OneToMany(mappedBy = "movimentacao", cascade = CascadeType.ALL, orphanRemoval=true)
	@LazyCollection(LazyCollectionOption.FALSE)
	public List<ValoresEvento> getValoresEvento() {
		return valoresEvento;
	}
	/**
	 * Configura os valores eventos de uma movimentação.
	 */
	public void setValoresEvento(List<ValoresEvento> valoresEventos) {
		this.valoresEvento = valoresEventos;
	}
	
	@Transient
	public String getPeriodo() {
		return this.mes + "/" + this.ano;
	}

	@Column(name="mov_irrf")
	public BigDecimal getIrrf() {
		return irrf;
	}

	public void setIrrf(BigDecimal irrf) {
		this.irrf = irrf;
	}

	@Column(name="mov_fgts")
	public BigDecimal getFgts() {
		return fgts;
	}

	public void setFgts(BigDecimal fgts) {
		this.fgts = fgts;
	}

	@ManyToOne
	@JoinColumn(name = "fol_id")
	@LazyCollection(LazyCollectionOption.FALSE)
	public Folha getFolha() {
		return folha;
	}

	public void setFolha(Folha folha) {
		this.folha = folha;
	}
	
	@Column(name="mov_salario_base_movimentacao", nullable=false)
	public BigDecimal getSalarioBaseMovimentacao() {
		return salarioBaseMovimentacao;
	}

	public void setSalarioBaseMovimentacao(BigDecimal salarioBaseMovimentacao) {
		this.salarioBaseMovimentacao = salarioBaseMovimentacao;
	}
	
	@Transient
	public String getLiquidoFormatado() {
		return Util.obterValorFormatado(liquido);
	}
	
	@Transient
	public String getInssFormatado() {
		return Util.obterValorFormatado(inss);
	}
	
	@Transient
	public String getFgtsFormatado() {
		return Util.obterValorFormatado(fgts);
	}
	
	@Transient
	public String getProventosFormatado() {
		return Util.obterValorFormatado(proventos);
	}
	
	@Transient
	public String getIrrfFormatado() {
		return Util.obterValorFormatado(irrf);
	}
	
	@Transient
	public String getDescontosFormatado() {
		return Util.obterValorFormatado(descontos);
	}
	
	@Transient
	public String getSalarioFamiliaFormatado() {
		return Util.obterValorFormatado(salarioFamilia);
	}
	
	@Transient
	public String getSalarioBaseMovimentacaoFormatado() {
		return Util.obterValorFormatado(salarioBaseMovimentacao);
	}

	@Column(name="mov_total_salario_familia")
	public BigDecimal getTotalSalarioFamilia() {
		return totalSalarioFamilia;
	}

	public void setTotalSalarioFamilia(BigDecimal totalSalarioFamilia) {
		this.totalSalarioFamilia = totalSalarioFamilia;
	}

	@Column(name="mov_total_inss")
	public BigDecimal getTotalInss() {
		return totalInss;
	}

	public void setTotalInss(BigDecimal totalInss) {
		this.totalInss = totalInss;
	}

	
	@Column(name="mov_total_irrf")
	public BigDecimal getTotalIrrf() {
		return totalIrrf;
	}

	public void setTotalIrrf(BigDecimal totalIrrf) {
		this.totalIrrf = totalIrrf;
	}

	@Column(name="mov_total_fgts")
	public BigDecimal getTotalFgts() {
		return totalFgts;
	}

	public void setTotalFgts(BigDecimal totalFgts) {
		this.totalFgts = totalFgts;
	}

}
